//
//  WBHomeViewModel.swift
//  SinaWeibo
//
//  Created by zhuangqianwei on 16/11/17.
//  Copyright © 2016年 zhuangqianwei. All rights reserved.
//

import UIKit
import SVProgressHUD
import SDWebImage
class WBHomeViewModel: NSObject {

    lazy var viewModelArray: [WBStatusViewModel] = [WBStatusViewModel]()
    //  加载数据
    func loadData(isPullup: Bool,finished:@escaping (Bool,Int) -> ()){
        
        var maxId: Int64 = 0
        var sinceId: Int64 = 0
        if isPullup {
            //上拉
            maxId = viewModelArray.last?.status?.id ?? 0
            if maxId != 0 {
                maxId -= 1
            }
        }else{
            
            sinceId = viewModelArray.first?.status?.id ?? 0
            
        }
        //使用StatusDAl来完成数据的请求
        WBStatusDAL.loadHomeData(sinceId: sinceId, maxId: maxId) { (array) in
            //如果数组为空 请求失败
            if array == nil {
                finished(false,0)
                return
            }
            //请求成功
            //遍历数组，字典转模型
            var tempArray = [WBStatusViewModel]()
            for item in array!{
                let viewModel = WBStatusViewModel()
                let s = WBStatus()
                //添加到一个临时数组中 获取数据都是按页一次获取20条数据
                s.yy_modelSet(with: item)
                viewModel.status = s
                //根据viewmodel来计算行高
                let cell = self.loadCell(viewModel: viewModel)
                cell.viewModel = viewModel
                //强制提前刷新cell
                cell.layoutIfNeeded()
                //获取toolbar 最大值
                viewModel.rowHeight = cell.toolBar.frame.maxY
                tempArray.append(viewModel)
            }
            //执行成功的回调
            //如果上拉加载更多数据 追加
            if isPullup {
                self.viewModelArray = self.viewModelArray + tempArray
            }else{
                //初次多实惠直接赋值 或者 下拉刷新的时候 执行插入到前面操作
                self.viewModelArray = tempArray + self.viewModelArray
                
            }
 
            //在这里执行回调能过保证单张图片下载完毕吗？
             self.cacheStatusSingleImage(array: tempArray, finished: finished)
            
            finished(true,tempArray.count)
        }
        
        
    }

    //缓存单张图片
    private func cacheStatusSingleImage(array: [WBStatusViewModel],finished: @escaping (Bool,Int) -> ()) {
        if array.count == 0 {
            //一定要执行回调
            finished(true, 0)
            return
        }
        
        //遍历视图模型
        //使用调度组 入组和出组必须成对出现,没有出组不会执行回调
        let group = DispatchGroup()
        for viewmodel in array {
            if viewmodel.imageURLs?.count == 1 {
                //只有一张图图片
                //执行下载图片的操作
                //异步任务 希望所有的异步任务执行完毕之后再执行回调
                //在开始异步任务之前 执行入组的操作 ,调度组中的异步任务 + 1
                group.enter()
                let url = URL(string: viewmodel.imageURLs?.first?.wap360 ?? "")
                //.retryFailed 就可能导致程序崩溃
                SDWebImageManager.shared().downloadImage(with:url, options: [], progress: nil, completed: { (_, _, _, _, _) in
                    print("----单张图片下载成功")
                    //
                    //finished(true, array.count)
                    //出组, 标识调度组中的异步任务 -1
                    group.leave()
                })
            }
        }
        //执行统一的回调
        group.notify(queue: DispatchQueue.main, execute: {
            print("----所有的单张图片都下载完毕")
            finished(true, array.count)
        })
    }
    private func loadCell(viewModel: WBStatusViewModel) -> WBStatusCell {
        return (viewModel.status?.retweeted_status == nil) ? orginalCell : reweetedCell
        
    }
}
